package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Spring框架下持久层名称都为repository
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    // ElasticsearchRepository接口中包含了很多基本的增删改查方法
    // 只需要指定我们要操作的实体类,就会自动生成它们,让我们使用
    // 指定的方式是:ElasticsearchRepository<[实体类名],[实体类主键类型]>

    // SpringData框架自定义查询
    // 直接按照SpringData规定的格式编写方法名,无论是数据库还是Es查询逻辑代码会自动生成
    // query:表示这是一个查询语句,类似sql的select
    // Item\Items:表示查询的实体类型,带s返回集合
    // By:开始设置条件的标识,类似sql的where
    // Title:是要查询的列名
    // Matches:是查询分词结果,类似sql的like
    Iterable<Item> queryItemsByTitleMatches(String title);
    //             select * from item where like %?%

    // 多条件查询
    // 多个条件直接直接使用And或Or进行逻辑表达
    // 参数名称其实是无关的,内部是按照参数顺序赋值
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);


    // 排序查询
    // 为了查询出较多的数据,我们在上面多条件查询的基础上,将And条件修改为Or再进行排序
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title,String brand);

    // 分页查询
    // 参数添加Pageable pageable,这个参数中包含分页的要求(第几页,每页多少条)
    // 返回值修改为Page 类型,这个类型的对象不但包含查询结果,还包含分页信息
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);


}






